﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EGym.BL.Exceptions;
using EGym.Data;

namespace EGym.BL.DataGestor
{
    public class AlunoGestor : BaseGestor
    {
        #region Propriedades
        public IEnumerable<BussinessLayerEntryException> BussinessLayerEntryExceptions { get; private set; }
        #endregion

        #region Construtores

        public AlunoGestor(DBDataContext db)
        {
            BussinessLayerEntryExceptions = new List<BussinessLayerEntryException>();
            DB = db;
        }

        #endregion

        #region Metodos

        #region Publicos

        public Aluno GetAlunoById(int afiliadoId, 
                                        int id)
        {
            var aluno = (from reg in DB.Alunos
                         where reg.AfiliadoId.Equals(afiliadoId) && 
                               reg.AlunoId.Equals(id)
                         select reg
                         ).FirstOrDefault();
            return aluno;
        }
        
        public int GetAlunosCount(int afiliadoId)
        {
            var contador = (from reg in DB.Alunos
                        where reg.AfiliadoId.Equals(afiliadoId)
                        select reg
                        ).Count();
            return contador;
        }

        public int GetAlunosPageCount(int afiliadoId, int pageSize)
        {
            var contador = GetAlunosCount(afiliadoId);
            return pageSize > 0 ? contador / pageSize : 1;
        }
        
        public int GetAlunosLatPageIndex(int afiliadoId, int pageSize)
        {
            var contador = GetAlunosPageCount(afiliadoId,pageSize);
            return pageSize > 0 ? contador / pageSize : 1;
        }
        
        public IEnumerable<Aluno> GetAlunosPaginedList(int afiliadoId,
                                        int pageSize, int pageIndex)
        {
            var list = (from reg in DB.Alunos
                        where reg.AfiliadoId.Equals(afiliadoId)
                        select reg
                        ).Skip(pageSize * (pageIndex - 1)).Take(pageSize);
            return list;
        }

        public IEnumerable<Aluno> GetAlunosPaginedListByNome(int afiliadoId,string nome,
                                        int pageSize, int pageIndex)
        {
            var list = (from reg in DB.Alunos
                        where reg.AfiliadoId.Equals(afiliadoId) && 
                              reg.Nome.ToLower().Contains(nome.ToLower())
                        select reg
                        ).Skip(pageSize * (pageIndex - 1)).Take(pageSize);
            return list;
        }

        /// <summary>
        /// Retorna uma lista com todos alunos cadastrados do afiliado selecionado.
        /// </summary>
        /// <param name="afiliadoId">Id do afiliado a ser filtrado para o filtro da lista de aluno</param>
        /// <returns>Lista de <c ref="EGym.Data.Aluno">Aluno</c></returns>
        public IEnumerable<Aluno> GetAlunos(int afiliadoId)
        {
            var list = (from reg in DB.Alunos
                        where reg.AfiliadoId.Equals(afiliadoId)
                        select reg
                        );
            return list;
        }

        public void AdcionarAlunoAssociadoComAfiliacaoAssociada(int afiliadoId, Aluno aluno)
        {
            if (aluno.AlunoId.Equals(0))
            {
                AplicaValoresAutomaticosParaInsercao(afiliadoId, aluno);
                
                DB.Alunos.InsertOnSubmit(aluno);
            }

            AplicaTratamentoACampoOpcionais(aluno);

            DB.SubmitChanges();
        }

        public void ExcluiAluno(Aluno aluno)
        {
            DB.Alunos.DeleteOnSubmit(aluno);
            DB.SubmitChanges();
        }

        #endregion

        #region Privados

        private void AplicaTratamentoACampoOpcionais(Aluno aluno)
        {
        }

        private void AplicaValoresAutomaticosParaInsercao(int afiliadoId, Aluno aluno)
        {
            aluno.AfiliadoId = afiliadoId;
            aluno.AlunoId = NextId(afiliadoId);
            aluno.TwitterAccount = string.Empty;
        }

        private int NextId(int afiliadoId)
        {
            var afiliado = (from reg in DB.Alunos
                            orderby reg.AlunoId descending
                            where reg.AfiliadoId.Equals(afiliadoId)
                            select reg).FirstOrDefault();
            int retorno = afiliado != null ? afiliado.AlunoId + 1 : 1;
            return retorno;
        }

        private IEnumerable<BussinessLayerEntryException>  ValidaInscricao(Aluno aluno)
        {
            return ValidaExistencia(aluno);
        }

        private IEnumerable<BussinessLayerEntryException> ValidaExistencia(Aluno aluno)
        {
            var bussinessLayerEntryExceptions = new List<BussinessLayerEntryException>();


            return bussinessLayerEntryExceptions;
        }

        #endregion
        #endregion

    }
}